package org.example.netty.moreSocketClient.server;

import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.channel.group.ChannelGroup;
import io.netty.channel.group.DefaultChannelGroup;
import io.netty.util.concurrent.GlobalEventExecutor;

public class ChatServerHandler extends SimpleChannelInboundHandler<String> {
    // 定义一个Channel组，管理所有的Channel,GlobalEventExecutor.INSTANCE 是全局的事件执行器,是一个单例,线程安全,可以直接使用
    private static ChannelGroup channelGroup = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);

    //******* 通道读取事件，即客户端发送数据时触发 *******/
    @Override
    protected void channelRead0(ChannelHandlerContext channelHandlerContext, String s) throws Exception {
        // 获取当前Channel
        Channel currentChannel = channelHandlerContext.channel();
        // 遍历ChannelGroup中的每一个Channel，给每个Channel对应的客户端发送消息
        for (Channel channel : channelGroup) {
            if (channel != currentChannel){
                channel.writeAndFlush("[客户]"+currentChannel.remoteAddress()+"说："+s);
            }else{
                channel.writeAndFlush("[自己]说："+s);
            }
        }
    }

    /***** 通道注册事件，即客户端连接服务器完成时触发 *******/
    @Override
    public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
        // 将新的通道加入到ChannelGroup中，通知所有已经连接的客户端
        channelGroup.writeAndFlush("[客户端] - " + ctx.channel().remoteAddress() + "加入聊天室");
        channelGroup.add(ctx.channel());
    }

    /***** 通道移除事件，即客户端断开连接时触发 *******/
    @Override
    public void handlerRemoved(ChannelHandlerContext ctx) throws Exception {
        channelGroup.writeAndFlush("[客户端] - " + ctx.channel().remoteAddress() + "离开聊天室");
        // 自动从ChannelGroup中移除Channel
    }
    ///****** 通道激活事件，即客户端连接服务器完成时触发 *******/
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        System.out.println(ctx.channel().remoteAddress() + "上线了");
        channelGroup.writeAndFlush("[客户端] - " + ctx.channel().remoteAddress() + "加入聊天室");
        channelGroup.add(ctx.channel());
    }
    ///****** 通道关闭事件，即客户端断开连接时触发 *******/
    @Override
    public void channelInactive(ChannelHandlerContext ctx) throws Exception {
        System.out.println(ctx.channel().remoteAddress() + "下线了");
        channelGroup.writeAndFlush("[客户端] - " + ctx.channel().remoteAddress() + "离开聊天室");

    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        cause.printStackTrace();
        ctx.close();
    }

}
